package learnjava.basic.other;

public class TestInnerClass {

    public static void main(String[] args) {
        //访问非静态内部类的方法
        new Outer().new Inner().method();
        //访问静态内部类的方法
        new Outer.StaticInner().method();
        //访问静态内部类的静态方法
        Outer.StaticInner.staticMethod();
        //访问局部位置的内部类
        new Outer().method();
        //访问匿名内部类
        new Outer().method1();
    }
}

class Outer {

    int i = 0;

    //成员位置内部类
    class Inner{
        void method(){
            System.out.println("Inner::method::"+i);
        }
    }

    //成员位置静态内部类
    static class StaticInner{
        void method(){
            System.out.println("StaticInner::method::只能访问外部静态变量");
        }
        static void staticMethod(){
            System.out.println("StaticInner::staticMethod::只有静态内部类可以定义静态方法");
        }
    }

    //局部位置内部类
    void method(){
        int local = 2; local = 3;
        final int local1 = 3;
        class LocalInner{
            void func(){
//                不可访问函数内非final变量
//                System.out.println("LocalInner::func"+local);
                System.out.println("LocalInner::func::"+local1);
                System.out.println("LocalInner::func::"+i);
            }
        }
        new LocalInner().func();
    }

    //匿名内部类
    void method1(){

        new MyInterface(){
            @Override
            public void interfaceMethod() {
                System.out.println("匿名内部类");
            }
        }.interfaceMethod();
    }

}

interface MyInterface{
    void interfaceMethod();
}
